atspi: Emit property changes for focus
authorMatthias Clasen <mclasen@redhat.com>
Mon, 12 Oct 2020 18:11:30 +0000 (14:11 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 12 Oct 2020 19:10:40 +0000 (15:10 -0400)
With this orca, actually speaks \o/.  Sadly, it only
says 'gtk modelbutton widget' so far, but its a start.

gtk/a11y/gtkatspicontext.c

index e613649b6d9500401fcf17f34323037ce1dd0a92..5b904c40979ba462828ae0d2c81b11736a501a0c 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "gtkatspicontextprivate.h"
 
+#include "gtkaccessibleprivate.h"
+
 #include "gtkatspicacheprivate.h"
 #include "gtkatspirootprivate.h"
 #include "gtkatspiprivate.h"
@@ -132,6 +134,12 @@ collect_states (GtkAtSpiContext    *self,
         }
     }
 
+  if (gtk_widget_get_focusable (widget))
+    set_atspi_state (states, ATSPI_STATE_FOCUSABLE);
+
+  if (gtk_widget_has_focus (widget))
+    set_atspi_state (states, ATSPI_STATE_FOCUSED);
+
   if (gtk_at_context_has_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_ORIENTATION))
     {
       value = gtk_at_context_get_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_ORIENTATION);
@@ -667,9 +675,10 @@ gtk_at_spi_context_state_change (GtkATContext                *ctx,
                                  GtkAccessibleAttributeSet   *relations)
 {
   GtkAtSpiContext *self = GTK_AT_SPI_CONTEXT (ctx);
+  GtkWidget *widget = GTK_WIDGET (gtk_at_context_get_accessible (ctx));
   GtkAccessibleValue *value;
 
-  if (!gtk_widget_get_realized (GTK_WIDGET (gtk_at_context_get_accessible (ctx))))
+  if (!gtk_widget_get_realized (widget))
     return;
 
   if (changed_states & GTK_ACCESSIBLE_STATE_CHANGE_BUSY)
@@ -815,6 +824,12 @@ gtk_at_spi_context_state_change (GtkATContext                *ctx,
       g_variant_unref (v);
       g_free (label);
     }
+
+  if (changed_platform & GTK_ACCESSIBLE_PLATFORM_CHANGE_FOCUSABLE)
+    emit_state_changed (self, "focusable", gtk_widget_get_focusable (widget));
+
+  if (changed_platform & GTK_ACCESSIBLE_PLATFORM_CHANGE_FOCUSED)
+    emit_state_changed (self, "focused", gtk_widget_has_focus (widget));
 }
 
 static void